iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

程式小白的 vue.js 學習筆記系列 第 15

Day 15 : 【Composition API 6】$refs、Provider 與 inject

  • 分享至 

  • xImage
  •  

今天要講的內容一樣延續之前的主題 - 怎麼在 composition API 中繼續使用我們熟悉的老朋友 XD

ref & $refs

由於到了 composition API 之後,我們不能再繼續用 this 來取用 $refs 了QQ
因此今天就來看看怎麼在 composition API 中正確取用 $refs 啦~

<button type="button" ref="btn">按鈕</button>
<card ref="card"></card>
// 元件
const {creatApp,ref,onMounted} = Vue

const card = {
    template:`<div class="card">
        <div class="card-body">
            <h5 class="card-title"></h5>
        </div>
    </div>`,
    setup(props){
        function getConsole(){
            console.log(context)
        }
        return{
           getConsole
        }
    }
}

首先,我們需要在 setup 內定義變數。此處的變數名稱需與 html 的 ref 的名稱相同,並傳入 null,接著到 onMounted 去取用就取到 DOM 啦~

// 父層
const app = creatApp({
    components:{ card },
setup(){
    const person = ref({
        name:"小花"
    })
    
    //此處須與 ref 名稱相同
    const btn = ref(null);
    const card = ref(null);
    
    onMounted(()=>{
        console.log(btn.value) // <button type="button" ref="btn">按鈕</button>
        console.log(card.value) //<div class="card"><div class="card-body"><h5 class="card-title"></h5></div></div>
    })
    return{
        person,
        btn,
        card
    }
}
})

Provider & Inject

先承認 Provider & Inject 我實務上超少碰到,基本已經忘光光了 XD 因為通常資料只跨一層的話就直接用 emit & props,跨很多層的話就直接用狀態管理工具,如 vuex or pinia 來做管理了。

雖然但是,也不是說所有東西都得塞狀態管理工具,傳遞的資料最好是給很多頁面覆用的,才適合放在狀態管理工具裡。因此你如果確認資料的流向非常單純,就是那個頁面要用到!! 但又隔好幾層的狀況下,你可能就會需要 Provider & Inject 了。

好的,那就先講簡單講一下 Provider & Inject 分別是什麼作用好了。

Provider : 可進行跨元件層級地資料傳遞,將資料從外層傳入相隔兩、三層的內層。
Inject : 把外層的資料接收進來。

還是直接來看看程式碼比較快。

provide 會帶兩個參數,第一個是我們自定義的名稱、第二個是要傳輸的資料內容。

// 父層
const app = creatApp({
    components:{ card },
setup(){
    // 注意這裡不是用 ref 來定義
    const person = {
        name:"小花"
    }
    
    provide('person',person)
    
    return{
       person
    }
}
})

雖然能透過 inject 正確接收來自外層的資料,但這樣的資料是不具 雙向綁定的特性的,因為我們在外層定義資料的時候是用 物件。 如果要讓傳進的資料具有雙向綁定的特性,在定義變數時就要先透過 ref & reactive 來定義。

// 元件
const {creatApp,ref,provide,inject} = Vue

const card = {
    template:`<div class="card">
        <div class="card-body">
            <h5 class="card-title">{{person.name}}</h5> //小花
            <input type="text" v-model="person.name"> // 就算在這裡綁 v-model 也不會雙向綁定
        </div>
    </div>`,
    setup(props){
        // 在這裡使用 inject 做接收
        const person = inject("person")
        
        return{
            person
        }
    }
}

上一篇
Day 14 : 【Composition API 5】 props & emit
下一篇
Day 16 : 【 Vue 的狀態管理工具 1】 Vuex
系列文
程式小白的 vue.js 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言